package main
import (
	"fmt"
)
// 用户自定义的函数类型
type add func(a int, b int) int
// // 高阶函数
func simple(a func(a, b int) int) {
	fmt.Println(a(60, 7))
}
// 在其它函数中返回函数
func simple1() func(a, b int) int {
	f := func(a, b int) int{
		return a + b
	}
	return f
}
// 闭包
func appendStr() func(string) string {
	t := "Hello"
	c := func(b string) string {
		t = t + " " + b
		return t
	}
	return c
}



//  33. 函数是一等公民（头等函数）
func main(){
	// 匿名函数
	a1 := func() {
		fmt.Println("hello world first class function")
	}
	a1()
	fmt.Printf("%T", a1)

	// 可以不用调用 直接运行的匿名函数
	func(n string) {
		fmt.Println("\n Welcome ", n)
	}("yang hao")

	// 用户自定义的函数类型
	var a2 add = func(a int, b int) int {
		return a + b
	}
	sum1 := a2(1,2)
	fmt.Println("sum1= ", sum1)

	// 高阶函数
	// 接收一个或多个函数作为参数
	// 返回值是一个函数
	f := func(a, b int) int {
		return a - b
	}
	fmt.Println("=======高阶函数======= ")
	simple(f)

	// 在其它函数中返回函数
	s1 := simple1()
	fmt.Println("=======在其它函数中返回函数======= ")
	fmt.Println(s1(60, 7))

	// 闭包
	fmt.Println("=======闭包======= ")
	
	a4 := appendStr()
	b4 := appendStr()
	fmt.Println(a4(" World"))
	fmt.Println(b4(" Everyone"))

	fmt.Println(a4("aaaaaa444"))
    fmt.Println(b4("bbbbbb444"))


	fmt.Println("=======示例======= ")
	a5 := []int{5, 6, 7, 8, 9}
	r5 := iMap(a5, func(n int) int {
		return n * 5
	})
	fmt.Println(r5)
}

func iMap(s []int, f func(int) int) []int {
	var r []int
	for _, v := range s{
		r = append(r, f(v))
	}
	return r
}